package cn.dj.system.service.impl;

import cn.dj.system.domain.Role;
import cn.dj.system.mapper.RoleMapper;
import cn.dj.system.service.IRoleService;
import cn.dj.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 业务实现类：角色
 */
@Service
public class RoleServiceImpl extends BaseServiceImpl<Role> implements IRoleService {
    @Autowired//注入
    private RoleMapper roleMapper;

    /**
     * 重写添加方法
     *
     * @param role
     */
    @Transactional
    @Override
    public void save(Role role) {
        //先添加角色，获取自增长的id
        super.save(role);
        //添加当前角色的菜单
        if (role.getMenus() != null && role.getMenus().size() > 0) {//前端传递过来的菜单menus数组不为空，并且至少选了一个菜单
            //中间表t_role_menu的数据在主表维护
            roleMapper.addRoleMenus(role.getId(), role.getMenus());//角色id，和菜单集合
        }
        //添加当前角色的权限
        if (role.getPermissions() != null && role.getPermissions().size() > 0) {//前端传递过来的菜单menus数组不为空，并且至少选了一个菜单
            //中间表t_role_menu的数据在主表维护
            roleMapper.addRolePermissions(role.getId(), role.getPermissions());//角色id，和菜单集合
        }
    }

    /**
     * 重写删除方法
     * @param id
     */
    @Transactional
    @Override
    public void del(Long id) {
        //先删中间表，再删除主表中的数据
        //删除当前角色的所有菜单【传递一个没有的role_id，不会报错，只是不会删除，因为没有这个数据】
        roleMapper.delMenusByRoleId(id);
        //删除当前角色的所有权限 - t_role_permission
        roleMapper.delPermissionsByRoleId(id);
        //删除当前角色和员工的中间表数据 - 因为要删除该角色，该员工也不会再有该角色的身份了
            //可以通过t_role主表或者t_employee主表来操作
        roleMapper.delEmployeeRoleByRoleId(id);
        //删除角色 - t_role
        super.del(id);
    }

    /**
     * 重写修改方法
     * 先删除再添加
     * 先操作中间表，最后操作主表
     * @param role
     */
    @Transactional
    @Override
    public void update(Role role) {
        //删除当前角色的所有菜单【传递一个没有的role_id，不会报错，只是不会删除，因为没有这个数据】
        roleMapper.delMenusByRoleId(role.getId());
        //删除当前角色的所有权限 - t_role_permission
        roleMapper.delPermissionsByRoleId(role.getId());//中间表的数据维护通过主表来操作 - 所以是主表的mapper.xml中
        //PS:角色修改，只是修改对应的权限和菜单，不影响员工 - 员工还是该角色，只是职能有变化-所以不用： roleMapper.delEmployeeRoleByRoleId(id);

        //添加当前角色的菜单
        if (role.getMenus() != null && role.getMenus().size() > 0) {//前端传递过来的菜单menus数组不为空，并且至少选了一个菜单
            //中间表t_role_menu的数据在主表维护
            roleMapper.addRoleMenus(role.getId(), role.getMenus());//角色id，和菜单集合
        }
        //添加当前角色的权限
        if (role.getPermissions() != null && role.getPermissions().size() > 0) {//前端传递过来的菜单menus数组不为空，并且至少选了一个菜单
            //中间表t_role_menu的数据在主表维护
            roleMapper.addRolePermissions(role.getId(), role.getPermissions());//角色id，和菜单集合
        }

        super.update(role);
    }

    /**
     * 重写批量删除
     * @param ids
     */
    @Transactional//事务管理 - 有一个出问题就回滚
    @Override
    public void patchDelete(List<Long> ids) {
        for (Long id : ids) {
            del(id);
        }
    }
}
